nition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) 
    {
        //这一题其实想到思路之后就很简单了 
        //我们只需要使用一个快慢指针就可以 
        // 快指针每次走两步 慢指针每次走一步
        // 如果这个链表是没有环的 那么最后快指针会走到空
        // 如果这个链表是有环的 那么快指针和慢指针会遇到


        ListNode *fast = head;
        ListNode *slow = head;

        while (fast && fast->next)
        {
            fast = fast->next->next;
            slow = slow->next;

            if (fast == slow)
            {
                // 这个时候我们就确定了这个链表是有环的 接着我们看是找到这个环在什么位置
                // 通过数学证明 让慢指针回到初始位置 之后两个指针每次走一格 相遇位置就是交点
                slow = head;
                while (slow != fast)
                {
                    slow = slow->next;
                    fast = fast->next;
                }

                return fast;
            }
        }


        return nullptr;

        
    }
};
